#include "Conexion.h"


Conexion::Conexion(unsigned int port,ColaMensajes* mensajes){
	this->conectado = true;
	//Creo la conexion en listen
	this->socket = new SocketProtocoloPlano();
	socket->listen(port, MAX_SERVER_LISTEN);
	requiereListen =true;
	this->mensajes = mensajes;
}


Conexion::Conexion(unsigned int port,std::string host,ColaMensajes* mensajes){
	this->conectado = true;
	//Creo la conexion
	this->socket = new SocketProtocoloPlano();

	socket->connect(host,port);

	requiereListen = false;

	this->mensajes = mensajes;
}

Conexion::Conexion(SocketProtocoloPlano* socket,ColaMensajes* mensajes) {
	this->conectado = true;

	this->socket = socket;
	this->mensajes = mensajes;
	requiereListen = false;
}

DTO* Conexion::conexionRecibir(){
	std::string lectura;
	DTO* dto = NULL;
	int response = socket->receive(lectura);

	if(response == SOCKET_ERROR){
		this->conectado = false;
	}

	if ( response > 0){
		dto = protocolo.deserializar(lectura);
	}

	return dto;
}


int Conexion::conexionEnviar(DTO* dto){
	std::string mensajeEnviar = protocolo.serializar(dto);

	int response = socket->send(mensajeEnviar);

	if(response == SOCKET_ERROR){
		this->conectado = false;
	}

	return response;
}

int Conexion::terminarSocket(){
	this->conectado = false;

	this->mensajes->signal();
	socket->shutdown();
	return socket->close();
}

void Conexion::actualizarSockets(){
	//Leo lols eventos de la interface, si hay, los envio
	if (requiereListen && estaConectado()) {
		SocketProtocoloPlano* nuevoSocket = socket->accept();
		delete this->socket;
		this->socket = nuevoSocket;
	}
}

bool Conexion::estaConectado(){
	return conectado;
}
Conexion::~Conexion()
{
}
